/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cgt;

import cdp.Cliente;
import cdp.Compra;
import cdp.Marca;
import cdp.Mensagem;
import cdp.Produto;
import cdp.Relatorio;
import cgd.DaoJpaCliente;
import cgd.DaoJpaCompra;
import cgd.DaoJpaMensagem;
import cgd.DaoJpaProduto;
import cgd.DaoJpaRelatorio;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Set;

/**
 *
 * @author CDIG01
 */
public class AplCompras {

    static AplCompras instance;

    public static AplCompras getInstance() {
        if (instance == null) {
            instance = new AplCompras();
        }
        return instance;
    }
    DaoJpaCliente clientesDAO = new DaoJpaCliente();
    DaoJpaCompra comprasDAO = new DaoJpaCompra();
    DaoJpaProduto produtosDAO = new DaoJpaProduto();
    DaoJpaMensagem mensagensDAO = new DaoJpaMensagem();
    DaoJpaRelatorio relatoriosDAO = new DaoJpaRelatorio();

    public void atualizarVips() throws Exception {
        try {
            List<Cliente> clientes = clientesDAO.buscarTodos(new Cliente());
            for (Cliente c : clientes) {
                if (c.getVendasMensais() >= 300) {
                    c.setVip(true);
                } else {
                    c.setVip(false);
                }
                c.setVendasMensais(0);
                clientesDAO.salvar(c);
            }
        } catch (Exception e) {
            throw new Exception("Erro ao atualizar clientes.");
        }
    }

    public int efetuarCompra(Compra c) throws Exception {
        int insuficientes = 0;
        Produto p = c.getProduto();
        Cliente cli = c.getCliente();

        cli.setVendasMensais(cli.getVendasMensais() + c.getValor());
        if (p.getQuantidade() < c.getQuantidade()) {
            insuficientes = c.getQuantidade() - p.getQuantidade();
        } else {
            p.setQuantidade(p.getQuantidade() - c.getQuantidade());
        }
        try {
            comprasDAO.salvar(c);
            produtosDAO.salvar(p);
            clientesDAO.salvar(cli);

            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date data = sdf.parse(sdf.format(new Date()));
            if (insuficientes > 0) {
                Mensagem msg = null;
                msg = mensagensDAO.buscarProdutoDia(p, data);
                if (msg != null) {
                    msg.setQuantidade(msg.getQuantidade() + insuficientes);
                } else {
                    msg = new Mensagem();
                    msg.setCompra(c);
                    msg.setProduto(p);
                    msg.setQuantidade(insuficientes);
                    msg.setData(data);
                }
                mensagensDAO.salvar(msg);
            }
            Relatorio rel = null;
            rel = relatoriosDAO.buscarProdutoDia(p, data);
            if (rel != null) {
                rel.setQuantidade(rel.getQuantidade() + c.getQuantidade());
            } else {
                rel = new Relatorio();
                rel.setData(data);
                rel.setProduto(p);
                rel.setQuantidade(c.getQuantidade());
            }
            relatoriosDAO.salvar(rel);
        } catch (Exception e) {
            throw new Exception("Erro ao efetuar compra.");
        }
        return insuficientes;
    }

    public List<Relatorio> relatorioVendas(Date d1, Date d2) throws Exception {
        try {
            return relatoriosDAO.buscarPeriodo(d1, d2);
        } catch (Exception e) {
            throw new Exception("Erro ao consultar relatorios.");
        }
    }

    public List<Mensagem> buscarMensagens() throws Exception {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date data = sdf.parse(sdf.format(new Date()));
            return mensagensDAO.buscarDia(data);
        } catch (Exception e) {
            throw new Exception("Erro ao consultar relatorios.");
        }
    }

    public List relatorioProdutos() throws Exception {
        List relatorio = new ArrayList();
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date data = sdf.parse(sdf.format(new Date()));

            List<Produto> produtos = produtosDAO.buscarTodos(new Produto());
            for (Produto p : produtos) {
                Relatorio r = relatoriosDAO.buscarProdutoDia(p, data);
                Mensagem m = mensagensDAO.buscarProdutoDia(p, data);

                int estoque = p.getQuantidade();
                int insuficientes = (m != null) ? m.getQuantidade() : 0;
                int vendidas = (r != null) ? r.getQuantidade() : 0;
                
                relatorio.add(p);
                relatorio.add(estoque);
                relatorio.add(insuficientes);
                relatorio.add(vendidas);
            }
        } catch (Exception e) {
            throw new Exception("Erro ao consultar relatorio");
        }
        return relatorio;
    }
}
